﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.CultivosEstaciones
{
	public class CultivosEstacionService
		: ICultivosEstacionService
	{
		#region Private properties

		private ICultivosEstacionRepository _cultivosEstacionRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosEstacionRepository"></param>
		public CultivosEstacionService(ICultivosEstacionRepository cultivosEstacionRepository)
		{
			if (cultivosEstacionRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "cultivosEstacionRepository");
			_cultivosEstacionRepository = cultivosEstacionRepository;
		}

		#endregion

		#region ICultivosEstacionService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosEstacion"></param>
		public void AddCultivosEstacion(Entities.CultivosEstacion cultivosEstacion)
		{
			if (cultivosEstacion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivosEstacion");
			IUnitOfWork unitOfWork = _cultivosEstacionRepository.StoreContext;
			_cultivosEstacionRepository.Add(cultivosEstacion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosEstacion"></param>
		public void ChangeCultivosEstacion(Entities.CultivosEstacion cultivosEstacion)
		{
			if (cultivosEstacion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivosEstacion");
			IUnitOfWork unitOfWork = _cultivosEstacionRepository.StoreContext;
			_cultivosEstacionRepository.Modify(cultivosEstacion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public List<Entities.CultivosEstacion> FindAllCultivosEstaciones()
		{
			return _cultivosEstacionRepository.GetAll().OrderBy(e => e.Nombre).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="status"></param>
		/// <returns></returns>
		public List<Entities.CultivosEstacion> FindCultivosEstacionesByStatus(bool status = true)
		{
			var specification = new CultivosEstacionesByStatusSpecification(status);
			return _cultivosEstacionRepository.FindCutlivosEstacionesByStatus(specification).ToList();
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_cultivosEstacionRepository != null && _cultivosEstacionRepository.StoreContext != null)
				_cultivosEstacionRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
